/*****************************************
**  Nom : COLLOMB - SALINAS - CARRUELLE	- RASPAUD aussi :)**
**	Nom du fichier : main.c				**
**	Description : Programme principal 	**
**				  moteur d'inférence	**
**										**
**										**
**	Date : 14/08/2014				    **
**  Statut : In Work					**
*****************************************/

/*****************************************
**  Zone de declaration des includes    **
*****************************************/

#include "struct.h"

/*****************************************
**  Zone de declaration des prototypes  **
*****************************************/

 int menu(void);
 #warning (BEN) A deplacer, juste ici pour faire un test rapide --> ok
 int prechargment(FIFO_PAQUET *J1,FIFO_PAQUET *J2,FIFO_PAQUET *J3,FIFO_PAQUET *J4,FIFO_PAQUET *table);
  
/*****************************************
**  Zone du programme principal         **
*****************************************/

 int main (void)
 {
 	 FILE* fp = NULL;					// Descripteur de fichier
 	 ST_RES* Tete_Res = NULL;			// Pointeur vers la tete des regles
 	 ST_FAITS* Tete_Faits = NULL;		// Pointeur vers la tete des faits
 	 FIFO_PAQUET table;
	 FIFO_PAQUET J1;
	 FIFO_PAQUET J2;
	 FIFO_PAQUET J3;
	 FIFO_PAQUET J4;
 	 char but [20];						// String qui contiendra la regle a trouver
 	 int action=0;
	 int test=-1;
	 int test2[3];
	 char caracter;

 	 prechargment(&J1,&J2,&J3,&J4,&table);
 
	 do
	 {
		 action = menu();
		 switch(action)
		 {
			 case 1 : fp = CreerListeCh_OuvrirFic(Fic_Regles,"r");
 	 			 	  if(fp!=NULL && Tete_Res == NULL )
	 				  {
		 		 	  	 CreerListeCh_LireBases('R', fp, &Tete_Faits, &Tete_Res);
		 			 	 CreerListeCh_FermerFichier(fp);
		 		 	  }
				 	  break;
				 
			 case 2 : fp=CreerListeCh_OuvrirFic(Fic_Faits,"r");
	 				  if(fp!=NULL && Tete_Faits == NULL)
					  {
					 	 CreerListeCh_LireBases('F', fp, &Tete_Faits, &Tete_Res);
						 CreerListeCh_FermerFichier(fp);
					  }
					  break;
					  
			 case 3 : ChngAvt_ChainageAvant(Tete_Res, Tete_Faits);
			 		  break;
			 		  
			 case 4 :// ChainArr_VerifBut (but,Tete_Res, Tete_Faits); //variable de test d'erreur existantes(1; 0; -1)
			 		 // memset(but,0,MAXSIZE*sizeof(char));
			 		 ChainArr_Simulation(Tete_Res,Tete_Faits);
			 		  break;
			 		  
			 case 5 : CreerListeCh_AfficherListe('R', Tete_Res, Tete_Faits);
			 		  CreerListeCh_AfficherListe('F', Tete_Res, Tete_Faits);
			 		  break;
			 		  
			 case 6 : table=InitPartie_InitFIFO(0);
					  J1=InitPartie_InitFIFO(1);
					  J2=InitPartie_InitFIFO(2);
					  J3=InitPartie_InitFIFO(3);
					  J4=InitPartie_InitFIFO(4);
					  test=InitPartie_InitPartie(&table,&J1,&J2,&J3,&J4);
					  if(test==-1)
					  {
						printf("MAIN : Erreur dans la fonction init_partie !\n");
						return 0;
					  }
			 		  break;
			 		  
			 case 7 : DrlmntPartie_AfficheFIFO(&table);
			 		  break;
					  
			case 8 : DrlmntPartie_AfficheFIFO(&J1);
			 		  break;
					 
			case 9 : DrlmntPartie_AfficheFIFO(&J2);
			 		  break;
			 		  
			case 10 : DrlmntPartie_AfficheFIFO(&J3);
			 		  break;
				
			case 11 : DrlmntPartie_AfficheFIFO(&J4);
			 		  break;
					 
			case 12 : DrlmntPartie_ReturnCarte(&table,test2);
					  printf("Valeurs retournées ! carte 1=%d ; cartes 2=%d ; cartes 3=%d\n",test2[0],test2[1],test2[2]);
					  DrlmntPartie_ReturnCarte(&J1,test2);
					  printf("Valeurs retournées ! carte 1=%d ; cartes 2=%d ; cartes 3=%d\n",test2[0],test2[1],test2[2]);
					  DrlmntPartie_ReturnCarte(&J2,test2);
					  printf("Valeurs retournées ! carte 1=%d ; cartes 2=%d ; cartes 3=%d\n",test2[0],test2[1],test2[2]);
					  DrlmntPartie_ReturnCarte(&J3,test2);
					  printf("Valeurs retournées ! carte 1=%d ; cartes 2=%d ; cartes 3=%d\n",test2[0],test2[1],test2[2]);
					  DrlmntPartie_ReturnCarte(&J4,test2);
					  printf("Valeurs retournées ! carte 1=%d ; cartes 2=%d ; cartes 3=%d\n",test2[0],test2[1],test2[2]);
					  break;
					  
			case 13 :DrlmntPartie_MAJfaits(&table,Tete_Faits); 
	 				 break;
	 			
	 	    case 14 :DrlmntPartie_CLEANfaits(Tete_Faits);
	 				 break; 
					 
			case 15 : test=DrlmntPartie_EchgFIFOin(&J1,&table);
					  if(test==-1)
					  {
						printf("Main : Erreur in case 13 : 'DrlmntPartie_EchgFIFOin'\n");
						return 0;
					  }
					  break;
			
			case 16 : test=DrlmntPartie_EchgFIFOin(&J2,&table);
					  if(test==-1)
					  {
						printf("Main : Erreur in case 14 : 'DrlmntPartie_EchgFIFOin'\n");
						return 0;
					  }
					  break;
			
			case 17 : test=DrlmntPartie_EchgFIFOin(&J3,&table);
					  if(test==-1)
					  {
						printf("Main : Erreur in case 15 : 'DrlmntPartie_EchgFIFOin'\n");
						return 0;
					  }
					  break;
					  
			case 18 : test=DrlmntPartie_EchgFIFOin(&J4,&table);
					  if(test==-1)
					  {
						printf("Main : Erreur in case 16 : 'DrlmntPartie_EchgFIFOin'\n");
						return 0;
					  }
					  break;
					  
			case 19 : DrlmntPartie_ViderTable(&table,&J1);
					  break;
					  
			case 20 : caracter = DetectionTouche_Detect();
					  printf("Caractere tape :<%c>\n",caracter);
					  break;
					  
			case 21 : test=DrlmntPartie_Affiche3Cartes(&table);
					  if(test==-1)
					  {
					  	  printf("MAIN : Erreur dans la fonction 'DrlmntPartie_Affiche3Cartes' !\n");
						  return 0;
					  }
					  break;
					  
			case 22 : test=DrlmntPartie_WhoPlay(4,0);
					  printf("MAIN : retour fonction DrlmntPartie_WhoPlay = %d\n",test); //doit retourner 4
					  test=DrlmntPartie_WhoPlay(2,1);
					  printf("MAIN : retour fonction DrlmntPartie_WhoPlay = %d\n",test); //doit returner 3
					  test=DrlmntPartie_WhoPlay(4,1);
					  printf("MAIN : retour fonction DrlmntPartie_WhoPlay = %d\n",test); //doit returner 1
					  break;
					  
			case 23 : test=InitPartie_Free_Carte(&table,&J1,&J2,&J3,&J4);
					  if(test==-1)
					  	printf("InitPartie_Free_Carte : erreur !\n");
					  break;

	 		case 24 :CreerListeCh_FreeListe('R', &Tete_Res, &Tete_Faits);
	 		         CreerListeCh_FreeListe('F', &Tete_Res, &Tete_Faits);
					 InitPartie_Free_Carte(&table,&J1,&J2,&J3,&J4);
	 				 return 0; 

		 }
	 }while (action != 24);
	 return 0;
 }
 
 int menu(void)
 {
	 int choix = 0;
	 
	 printf("\n\t1.Lecture du fichier de règles et création de la liste chainée.\n");
	 printf("\t2.Lecture du fichier de faits et création de la liste chainée.\n");
	 printf("\t3.Lancement du chainage avant.\n");
	 printf("\t4.Lancement du chainage arrière.\n");
	 printf("\t5.Affichage de la liste des faits.\n");
	 printf("\t6.Initialisation de la partie.\n");
	 printf("\t7.Affiche la FIFO de 'Table'.\n");
	 printf("\t8.Affiche la FIFO de 'J1'.\n");
	 printf("\t9.Affiche la FIFO de 'J2'.\n");
	 printf("\t10.Affiche la FIFO de 'J3'.\n");
	 printf("\t11.Affiche la FIFO de 'J4'.\n");
	 printf("\t12.Retourne les valeurs des cinq FIFOs.\n");
	 printf("\t13.MAJ des faits(fonctions des 3 cartes de la fifoTable)\n");
	 printf("\t14.Nettoyer les faits.\n");
	 printf("\t15.Fait jouer le Joueur 1 (Joueur 1 pose une carte sur la table)\n");
	 printf("\t16.Fait jouer le Joueur 2 (Joueur 2 pose une carte sur la table)\n");
	 printf("\t17.Fait jouer le Joueur 3 (Joueur 3 pose une carte sur la table)\n");
	 printf("\t18.Fait jouer le Joueur 4 (Joueur 4 pose une carte sur la table)\n");
	 printf("\t19.Vide le paquet de 'table' vers 'J1'.\n");
	 printf("\t20.Detection d'une touche.\n");
	 printf("\t21.Affiche les trois dernières cartes du paquet 'table'.\n");
	 printf("\t22.Indique quel joueur doit jouer.\n");
	 printf("\t22.Free les cartes.\n");
	 printf("\t24.Quitter.\n");
	 printf("> ");
	 scanf("%d", &choix);
	 getchar();

	 return choix;
 }
 
int  prechargment(FIFO_PAQUET *J1,FIFO_PAQUET *J2,FIFO_PAQUET *J3,FIFO_PAQUET *J4,FIFO_PAQUET *table)
 {
 	memset(J1,0,sizeof(FIFO_PAQUET));
 	memset(J2,0,sizeof(FIFO_PAQUET));
 	memset(J3,0,sizeof(FIFO_PAQUET));
 	memset(J4,0,sizeof(FIFO_PAQUET));
 	memset(table,0,sizeof(FIFO_PAQUET));
 	return 0;
 }